package com.citywithincity.db.interfaces;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

import com.citywithincity.db.Page;
import com.citywithincity.db.PageVisitor;
import com.citywithincity.db.Record;
import com.citywithincity.db.RecordVisitor;
import com.citywithincity.db.ResultSetVisitor;


public interface Ar extends Select<Ar> {
	
	
	/**
	 * 查询列表
	 * @param sql
	 * @param args
	 * @return
	 */
	List<Record> query(String sql,Object...args);
	
	
	/**
	 * 查询
	 * @param visitor
	 * @param sql
	 * @param args
	 */
	void query(RecordVisitor visitor,String sql,Object...args);
	
	/**
	 * 设置key=>value
	 * @param name
	 * @param value
	 * @return
	 */
	Ar set(String name,Object value);
	
	
	/**
	 * 设置
	 * @param value
	 * @return
	 */
	Ar set(String value);
	
	/**
	 * 插入
	 * @param tableName
	 * @return
	 */
	int insert(String tableName);
	
	/**
	 * 插入，并且根据uniqueKeys防止重复插入
	 * @param tableName
	 * @param uniqueKeys
	 * @return
	 */
	int insert(String tableName,String[] uniqueKeys);
	
	/**
	 * 插入并且获取id，必须是auto的
	 * @param tableName
	 * @param pk
	 * @return
	 */
	long insertGetId(String tableName,String pk);
	
	/**
	 * 更新
	 * @param tableName
	 * @return
	 */
	int update(String tableName);
	
	/**
	 * 获取更新sql
	 * @param tableName
	 * @return
	 */
	String genUpdate(String tableName);
	
	/**
	 * 删除
	 * @param tableName
	 * @return
	 */
	int delete(String tableName);
	
	/**
	 * 摄制组表
	 * @param tableName
	 * @return
	 */
	Ar from(String tableName);
	
	/**
	 * 访问一张表
	 * @param tableName
	 * @param visitor
	 */
	void visit(String tableName,ResultSetVisitor visitor);
	
	/**
	 * 调用存储过程
	 * @param processName
	 * @param args
	 */
	void call(String processName,Object...args);
	/**
	 * 分页,下标从1开始
	 * @param tableName
	 * @param page
	 * @param pageSize
	 * @return
	 */
	Page<Record> page(String tableName,int page,int pageSize);
	
	
	/**
	 * 获取分页
	 * @param tableName
	 * @param position
	 * @param pageSize
	 * @return
	 */
	Page<Record> position(String tableName,int position,int pageSize);
	
	
	/**
	 * 获取分页
	 * @param tableName
	 * @param position
	 * @param pageSize
	 * @return
	 */
	List<Record> limit(String tableName,int position,int pageSize);
	
	/**
	 * 获取列表
	 * @param tableName
	 * @return
	 */
	List<Record> get(String tableName);
	
	
	/**
	 * 获取分页
	 * @param tableName
	 * @param page
	 * @param pageSize
	 * @return
	 */
	List<Record> get(String tableName,int page,int pageSize);
	
	/**
	 * 获取一行
	 * @param tableName
	 * @return
	 */
	Record getRow(String tableName);
	<T> T getValue(String table,String columnName);
	<T> T getValue(String table,String columnName,Class<T> clazz);
	List<Record> getSql(String sql);
	/**
	 * 将值同步至其他map中
	 * @param object
	 * @return
	 */
	Ar syncTo(Record object);
	Ar set(Map<String, ?> map);
	long selectSum(String table,String field);
	long selectMax(String table,String field);
	String selectMaxString(String table,String field);
	Connection getConnection();

	int getRows(String tableName);
	List<Record> getList(String sql);
	
	int insertOrUpdate(String tableName,String keyName);
	int insertOrUpdate(String tablename, String[] unikeys);
	
	
	PageVisitor<Record> startVisitPage(String tableName,int pageSize);

}
